package org.zhadoop.stream.cql.tasks;

import java.util.List;

import org.zhadoop.stream.cql.CQLResult;
import org.zhadoop.stream.cql.DriverContext;
import org.zhadoop.stream.cql.exception.CQLException;
import org.zhadoop.stream.cql.exception.SemanticAnalyzerException;
import org.zhadoop.stream.cql.hooks.SemanticAnalyzeHook;
import org.zhadoop.stream.cql.semanticanalyzer.analyzecontext.AnalyzeContext;
import org.zhadoop.stream.cql.semanticanalyzer.parser.context.ParseContext;
import org.zhadoop.streaming.config.StreamingConfig;

/**
 * 各类命令执行接口
 * @author zwd
 *
 */
public interface Task {
	
	/**
	 * 初始化
	 * @param dirverContext
	 * @param config
	 * @param analyzeHooks
	 * @throws CQLException
	 */
	void init(DriverContext driverContext,StreamingConfig config,List<SemanticAnalyzeHook> analyzeHooks) 
			throws CQLException;
	
	/**
	 * 任务执行接口
	 * 由于LazyTask的存在，部分任务是延迟处理的
	 * 所以该接口返回值为空，另外设置getResult接口获取task执行的结果
	 * @param parseContext
	 * @throws CQLException
	 */
	void execute(ParseContext parseContext) throws CQLException;
	
	/**
     * 获取解析结果
     */
    CQLResult getResult();
    
    /**
     * 语义分析之前执行的动作
     * @param context
     * @param parseContext
     * @throws SemanticAnalyzerException
     */
    void preAnalyze(DriverContext context,ParseContext parseContext) 
    		throws SemanticAnalyzerException;
	
    /**
     * 语义分析之后执行的动作
     * @param context
     * @param analyzeConext
     * @param parseContext
     * @throws SemanticAnalyzerException
     */
	void postAnalyze(DriverContext context, AnalyzeContext analyzeContext, ParseContext parseContext)
			throws SemanticAnalyzerException;
}
